<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: Inpainting using F-transform</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="../../d3/d81/tutorial_contrib_root.html">Tutorials for contrib modules</a></li><li class="navelem"><a class="el" href="../../d7/d36/tutorial_fuzzy.html">Fuzzy image processing tutorials</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Inpainting using F-transform </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1>Goal </h1>
<p>In this tutorial, you will learn how image inpainting using F-transform works. It consists in:</p>
<ul>
<li>basic theory behind,</li>
<li>three different algorithms.</li>
</ul>
<h1>Introduction </h1>
<p>The goal of this tutorial is to show that the inverse F-transform can be used for image reconstruction. By the image reconstruction, we mean a reconstruction of a corrupted image where corruption is everything that the original image does not include. It can be noise, text, scratch, etc. Proposal is to solve the problem of reconstruction with the help of an approximation technique. This means that we will be looking for an approximating image which is close to the given one and at the same time, does not contain what we recognize as the corruption. This task is called <em>image inpainting</em>.</p>
<h1>Fuzzy transform application </h1>
<p>As I shown in previous tutorial, F-transform is a tool of fuzzy mathematics highly usable in image processing. Let me rewrite the formula using kernel \(g\) introduced before as well:</p>
<p class="formulaDsp">
\[ F^0_{kl}=\frac{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} \iota_{kl}(x,y) g(x,y)}{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} g(x,y)}, \]
</p>
<p>where \(\iota_{kl} \subset I\) centered to pixel \((k \cdot h,l \cdot h)\) and \(g\) is a kernel. For purpose of image processing, a binary mask \(S\) is used such as</p>
<p class="formulaDsp">
\[ g^s_{kl} = g \circ s_{kl} \]
</p>
<p>where \(s_{k,l} \subset S\). Subarea \(s\) of mask \(S\) corresponds with subarea \(\iota\) of image \(I\). Operator \(\circ\) is element-wise matrix multiplication (Hadamard product). Formula is updated to</p>
<p class="formulaDsp">
\[ F^0_{kl}=\frac{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} \iota_{kl}(x,y) g^s(x,y)}{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} g^s(x,y)}. \]
</p>
<p>More details can be found in related papers.</p>
<h1>Code </h1>
<div class="fragment"><div class="line"><span class="comment">/* Sample - Inpainting</span></div><div class="line"><span class="comment"> * Target is to apply inpainting using F-transform</span></div><div class="line"><span class="comment"> * on the image &quot;input.png&quot;. The image is damaged</span></div><div class="line"><span class="comment"> * by various types of corruption:</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * input1 = image &amp; mask1</span></div><div class="line"><span class="comment"> * input2 = image &amp; mask2</span></div><div class="line"><span class="comment"> * input3 = image &amp; mask3</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * Three algorithms &quot;ft::ONE_STEP&quot;, &quot;ft::MULTI_STEP&quot;</span></div><div class="line"><span class="comment"> * and &quot;ft::ITERATIVE&quot; are demonstrated on the</span></div><div class="line"><span class="comment"> * appropriate type of damage.</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * ft::ONE_STEP</span></div><div class="line"><span class="comment"> * &quot;output1_inpaint.png&quot;: input1, mask1</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * ft::MULTI_STEP</span></div><div class="line"><span class="comment"> * &quot;output2_inpaint.png&quot;: input2, mask2</span></div><div class="line"><span class="comment"> * &quot;output3_inpaint.png&quot;: input3, mask3</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * ft::ITERATIVE</span></div><div class="line"><span class="comment"> * &quot;output4_inpaint.png&quot;: input3, mask3</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * Linear kernel with radius 2 is used for all</span></div><div class="line"><span class="comment"> * samples.</span></div><div class="line"><span class="comment"> */</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d0/d9c/core_2include_2opencv2_2core_8hpp.html">opencv2/core.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d4/dd5/highgui_8hpp.html">opencv2/highgui.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../df/dc0/fuzzy_8hpp.html">opencv2/fuzzy.hpp</a>&quot;</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span>std;</div><div class="line"><span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">void</span>)</div><div class="line">{</div><div class="line">    <span class="comment">// Input image</span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> I = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;input.png&quot;</span>);</div><div class="line"></div><div class="line">    <span class="comment">// Various masks</span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> mask1 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask1.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> mask2 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask2.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> mask3 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask3.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div><div class="line"></div><div class="line">    <span class="comment">// Apply the damage</span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> input1, input2, input3;</div><div class="line"></div><div class="line">    I.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77">copyTo</a>(input1, mask1);</div><div class="line">    I.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77">copyTo</a>(input2, mask2);</div><div class="line">    I.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77">copyTo</a>(input3, mask3);</div><div class="line"></div><div class="line">    <span class="comment">// Inpaint with various algorithm</span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> output1, output2, output3, output4;</div><div class="line"></div><div class="line">    <a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input1, mask1, output1, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ae6619bf12f07b1ec1f249341568fd56d">ft::ONE_STEP</a>);</div><div class="line">    <a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input2, mask2, output2, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ac76aa06a768ef2d483abe5db77cabd39">ft::MULTI_STEP</a>);</div><div class="line">    <a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input3, mask3, output3, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ac76aa06a768ef2d483abe5db77cabd39">ft::MULTI_STEP</a>);</div><div class="line">    <a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input3, mask3, output4, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88a42216ed5e5593d09ba0a26576061c33f">ft::ITERATIVE</a>);</div><div class="line"></div><div class="line">    <span class="comment">// Save output</span></div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;output1_inpaint.png&quot;</span>, output1);</div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;output2_inpaint.png&quot;</span>, output2);</div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;output3_inpaint.png&quot;</span>, output3);</div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;output4_inpaint.png&quot;</span>, output4);</div><div class="line"></div><div class="line">    <span class="comment">// Save damaged input for comparison</span></div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;input1.png&quot;</span>, input1);</div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;input2.png&quot;</span>, input2);</div><div class="line">    <a class="code" href="../../d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce">imwrite</a>(<span class="stringliteral">&quot;input3.png&quot;</span>, input3);</div><div class="line"></div><div class="line">    <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment --><h1>Explanation </h1>
<p>The sample below demonstrates the usage of image inpainting. Three artificial images are created using the same input and three different type of corruption. In the real life usage, the input image will be already presented but here we created it by ourselves.</p>
<p>First of all, we must load our image and three masks used for artificial damage creation.</p>
<div class="fragment"><div class="line"><span class="comment">// Input image</span></div><div class="line">Mat I = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;input.png&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Various masks</span></div><div class="line">Mat mask1 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask1.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div><div class="line">Mat mask2 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask2.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div><div class="line">Mat mask3 = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>(<span class="stringliteral">&quot;mask3.png&quot;</span>, <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80ae29981cfc153d3b0cef5c0daeedd2125">IMREAD_GRAYSCALE</a>);</div></div><!-- fragment --><blockquote class="doxtable">
<p>See that mask must be loaded as <code>IMREAD_GRAYSCALE</code>. </p>
</blockquote>
<p>In the next step, the masks are used for damaging our input image.</p>
<div class="fragment"><div class="line"><span class="comment">// Apply the damage</span></div><div class="line">Mat input1, input2, input3;</div><div class="line"></div><div class="line">I.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77">copyTo</a>(input1, mask1);</div><div class="line">I.copyTo(input2, mask2);</div><div class="line">I.copyTo(input3, mask3);</div></div><!-- fragment --><p>Using the masks, we applied three different kind of corruption on the same input image. Here is the result.</p>
<div class="image">
<img src="../../fuzzy_inp_input.jpg" alt="fuzzy_inp_input.jpg"/>
<div class="caption">
input1, input2 and input3</div></div>
 <blockquote class="doxtable">
<p>Do not forget that in real life usage, images <code>input1</code>, <code>input2</code> and <code>input3</code> are created naturally and used as the input directly. </p>
</blockquote>
<p>Declaration of output images follows. In the following lines, the method of inpainting is applied. Let me explain three different algorithms one by one.</p>
<p>First of them is <code>ONE_STEP</code>.</p>
<div class="fragment"><div class="line"><a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input1, mask1, output1, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ae6619bf12f07b1ec1f249341568fd56d">ft::ONE_STEP</a>);</div></div><!-- fragment --><p>The <code>ONE_STEP</code> algorithm simply compute direct F-transform ignoring damaged parts using kernel with radius <code>2</code> (as specified in the method calling). Inverse F-transform fill up the missing area using values from the components nearby. It is up to you to choose radius which is big enough.</p>
<p>Second is <code>MULTI_STEP</code>.</p>
<div class="fragment"><div class="line"><a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input2, mask2, output2, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ac76aa06a768ef2d483abe5db77cabd39">ft::MULTI_STEP</a>);</div><div class="line"><a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input3, mask3, output3, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88ac76aa06a768ef2d483abe5db77cabd39">ft::MULTI_STEP</a>);</div></div><!-- fragment --><p><code>MULTI_STEP</code> algorithm works in the same way but defined radius (<code>2</code> in this case) is automatically increased if it is found insufficient. If you want to fill up the hole and you are not sure how big radius you need, you can choose <code>MULTI_STEP</code> and let the computer decide. The lowest possible will be found.</p>
<p>Last one is <code>ITERATIVE</code>.</p>
<div class="fragment"><div class="line"><a class="code" href="../../d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085">ft::inpaint</a>(input3, mask3, output4, 2, <a class="code" href="../../df/d5b/group__fuzzy.html#gga847dcdc873389a919e2c3ba910a2bd39a4d3d0c977941e929e23e9c6cb4ae4715">ft::LINEAR</a>, <a class="code" href="../../df/d5b/group__fuzzy.html#ggaf609444993d5dcfe2d1837f80e6f2e88a42216ed5e5593d09ba0a26576061c33f">ft::ITERATIVE</a>);</div></div><!-- fragment --><p>Best choice in majority of cases is <code>ITERATIVE</code>. This way of processing use small radius of basic functions for small kind of damage and higher ones for bigger holes.</p>
<div class="image">
<img src="../../fuzzy_inp_output.jpg" alt="fuzzy_inp_output.jpg"/>
<div class="caption">
output1 (ONE_STEP), output2 (MULTI_STEP), output3 (MULTI_STEP), output4 (ITERATIVE)</div></div>
</div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:38 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
